#ifndef _STACK_ARRAY_H_
#define _STACK_ARRAY_H_
 
const int maxSize = 50;
 
template <class T>
class Stack 
{
public:
    Stack(){}; // 构造函数
    void Push(const T x) = 0; // 新元素进栈
    bool Pop() = 0; // 栈顶元素出栈
    virtual bool getTop(T &x) const = 0; // 读取栈顶元素，由x返回
    virtual bool isEmpty() const = 0; // 判断栈空否
    virtual bool isFull() const = 0; // 判断栈满否
    virtual int getSize() const = 0; // 计算栈中元素个数
};
 

const int stackIncreament = 20; // 栈溢出时扩展空间的增量
 
template <class T>
class SeqStack: public Stack<T>
{ // 顺序栈的类定义
public:
    SeqStack(int sz=50); // 构造函数，建立一个空栈
    ~SeqStack(); // 析构函数
    void Push(const T x); // 把x插入到栈顶,如果栈满，进行溢出处理
    bool Pop(); // 如果栈为空，不进行出栈，否则把栈顶元素出栈
    bool getTop(T &x) const; // 返回栈顶元素的值
    bool isEmpty()const; // 判断栈是否为空
    bool isFull()const; // 栈是否满
    int getSize()const; // 返回栈中元素的个数
    void clear(); // 清空栈的内容
    friend ostream& operator<< <T>(ostream &out, SeqStack<T> &s); // 输出栈中元素的重载操作
private:
    T *elements; // 存放栈中元素的栈数组
    int top; // 栈顶指针
    int maxSize; // 栈最大可容纳的元素个数
    void overflowProcess(); // 栈的溢出处理
};

//友元函数的声明
template <typename T>
ostream& operator<<(ostream &out, SeqStack<T> &s);

#endif
